// app.js
App({
  globalData: {
    userInfo: null,
    openid: null,
    isLogin: false,
    systemInfo: null,
    categories: [],
    settings: {
      monthlyBudget: 5000,
      currency: 'CNY',
      theme: 'light',
      notifications: true
    }
  },

  onLaunch() {
    console.log('记账本小程序启动')
    
    // 初始化云开发
    this.initCloud()
    
    // 获取系统信息
    this.getSystemInfo()
    
    // 检查登录状态
    this.checkLoginStatus()
    
    // 初始化分类数据
    this.initCategories()
  },

  onShow() {
    console.log('记账本小程序显示')
  },

  onHide() {
    console.log('记账本小程序隐藏')
  },

  onError(error) {
    console.error('小程序发生错误:', error)
    // 错误上报
    this.reportError(error)
  },

  /**
   * 初始化云开发
   */
  initCloud() {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力')
      return
    }

    wx.cloud.init({
      env: 'your-env-id', // 请替换为你的云开发环境ID
      traceUser: true
    })

    console.log('云开发初始化成功')
  },

  /**
   * 获取系统信息
   */
  getSystemInfo() {
    wx.getSystemInfo({
      success: (res) => {
        this.globalData.systemInfo = res
        console.log('系统信息:', res)
      },
      fail: (error) => {
        console.error('获取系统信息失败:', error)
      }
    })
  },

  /**
   * 检查登录状态
   */
  checkLoginStatus() {
    const userInfo = wx.getStorageSync('userInfo')
    const openid = wx.getStorageSync('openid')
    
    if (userInfo && openid) {
      this.globalData.userInfo = userInfo
      this.globalData.openid = openid
      this.globalData.isLogin = true
      console.log('用户已登录:', userInfo)
    } else {
      console.log('用户未登录')
    }
  },

  /**
   * 初始化分类数据
   */
  initCategories() {
    // 默认分类数据
    const defaultCategories = [
      // 支出分类
      { name: '餐饮', type: 'expense', icon: '🍽️', color: '#FF6B6B', isDefault: true },
      { name: '交通', type: 'expense', icon: '🚗', color: '#4ECDC4', isDefault: true },
      { name: '购物', type: 'expense', icon: '🛍️', color: '#45B7D1', isDefault: true },
      { name: '娱乐', type: 'expense', icon: '🎮', color: '#96CEB4', isDefault: true },
      { name: '医疗', type: 'expense', icon: '🏥', color: '#FFEAA7', isDefault: true },
      { name: '教育', type: 'expense', icon: '📚', color: '#DDA0DD', isDefault: true },
      { name: '住房', type: 'expense', icon: '🏠', color: '#98D8C8', isDefault: true },
      { name: '通讯', type: 'expense', icon: '📱', color: '#F7DC6F', isDefault: true },
      { name: '其他', type: 'expense', icon: '📦', color: '#BDC3C7', isDefault: true },
      
      // 收入分类
      { name: '工资', type: 'income', icon: '💰', color: '#2ECC71', isDefault: true },
      { name: '奖金', type: 'income', icon: '🎁', color: '#3498DB', isDefault: true },
      { name: '投资', type: 'income', icon: '📈', color: '#9B59B6', isDefault: true },
      { name: '兼职', type: 'income', icon: '💼', color: '#E67E22', isDefault: true },
      { name: '红包', type: 'income', icon: '🧧', color: '#E74C3C', isDefault: true },
      { name: '其他', type: 'income', icon: '💎', color: '#1ABC9C', isDefault: true }
    ]

    // 从缓存获取分类，如果没有则使用默认分类
    let categories = wx.getStorageSync('categories')
    if (!categories || categories.length === 0) {
      categories = defaultCategories
      wx.setStorageSync('categories', categories)
    }
    
    this.globalData.categories = categories
  },

  /**
   * 用户登录
   */
  async login() {
    try {
      // 获取登录凭证
      const loginRes = await wx.cloud.callFunction({
        name: 'login'
      })

      if (loginRes.result.success) {
        const { userInfo, openid } = loginRes.result.data
        
        // 保存用户信息
        this.globalData.userInfo = userInfo
        this.globalData.openid = openid
        this.globalData.isLogin = true
        
        // 缓存到本地
        wx.setStorageSync('userInfo', userInfo)
        wx.setStorageSync('openid', openid)
        
        console.log('登录成功:', userInfo)
        return { success: true, data: userInfo }
      } else {
        throw new Error(loginRes.result.message)
      }
    } catch (error) {
      console.error('登录失败:', error)
      return { success: false, message: error.message }
    }
  },

  /**
   * 用户退出登录
   */
  logout() {
    // 清除全局数据
    this.globalData.userInfo = null
    this.globalData.openid = null
    this.globalData.isLogin = false
    
    // 清除本地缓存
    wx.removeStorageSync('userInfo')
    wx.removeStorageSync('openid')
    wx.removeStorageSync('draftBill')
    
    console.log('用户已退出登录')
  },

  /**
   * 获取用户信息
   */
  getUserInfo() {
    return this.globalData.userInfo
  },

  /**
   * 获取用户openid
   */
  getOpenid() {
    return this.globalData.openid
  },

  /**
   * 检查是否已登录
   */
  isLogin() {
    return this.globalData.isLogin
  },

  /**
   * 获取分类列表
   */
  getCategories(type) {
    if (type) {
      return this.globalData.categories.filter(cat => cat.type === type)
    }
    return this.globalData.categories
  },

  /**
   * 更新用户设置
   */
  updateSettings(settings) {
    this.globalData.settings = { ...this.globalData.settings, ...settings }
    wx.setStorageSync('settings', this.globalData.settings)
  },

  /**
   * 获取用户设置
   */
  getSettings() {
    const settings = wx.getStorageSync('settings')
    if (settings) {
      this.globalData.settings = { ...this.globalData.settings, ...settings }
    }
    return this.globalData.settings
  },

  /**
   * 错误上报
   */
  reportError(error) {
    // 这里可以集成错误监控服务
    console.error('错误上报:', error)
    
    // 可以调用云函数上报错误
    wx.cloud.callFunction({
      name: 'reportError',
      data: {
        error: error.toString(),
        stack: error.stack,
        userAgent: this.globalData.systemInfo,
        timestamp: new Date().toISOString()
      }
    }).catch(err => {
      console.error('错误上报失败:', err)
    })
  },

  /**
   * 显示提示信息
   */
  showToast(title, icon = 'none', duration = 2000) {
    wx.showToast({
      title,
      icon,
      duration
    })
  },

  /**
   * 显示加载提示
   */
  showLoading(title = '加载中...') {
    wx.showLoading({
      title,
      mask: true
    })
  },

  /**
   * 隐藏加载提示
   */
  hideLoading() {
    wx.hideLoading()
  },

  /**
   * 格式化金额
   */
  formatAmount(amount) {
    if (typeof amount !== 'number') {
      amount = parseFloat(amount) || 0
    }
    return amount.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  },

  /**
   * 格式化日期
   */
  formatDate(date, format = 'YYYY-MM-DD') {
    if (!date) return ''
    
    const d = new Date(date)
    const year = d.getFullYear()
    const month = String(d.getMonth() + 1).padStart(2, '0')
    const day = String(d.getDate()).padStart(2, '0')
    const hour = String(d.getHours()).padStart(2, '0')
    const minute = String(d.getMinutes()).padStart(2, '0')
    
    return format
      .replace('YYYY', year)
      .replace('MM', month)
      .replace('DD', day)
      .replace('HH', hour)
      .replace('mm', minute)
  }
})